/**
 * @CLASSDESCRIPER:
首先让操作数的栈为空,一个元素的属性有下一个元素的地址和它自己本身的值。
每个元素都要有方法。  入栈的时候要判断它是不是头节点。
入栈：
头插法插入元素进入栈中，然后每插入一个元素，都将头节点的下一个节点地址和传进来的节点item值通过node构造方法赋值给新节点
再将新节点放入队列中，最后让head的next指向新节点
出栈：
首先你记录第一个元素地址，判断你第一个元素的地址是不是为空，如果为空的话返回null
否则使得头节点指向第一个元素地址的下一个元素地址，然后栈的总长度减一
 *  @AUTHOR:zhangweile
 * @PHONE:1993602749
 * @EMIAL:1993602749@qq.COM
 * @DATE: 2021/1/23
 * @PARAMDESCRIPER:
 * @OUTPARAMDESCRIPER:
 */
package zhang_wei_le;
public class ZHANG_WEI_LE_23_Q1{
    //首结点
    private Node head;
    //栈中元素个数
    private int n;
    public ZHANG_WEI_LE_23_Q1() {
        // 初始化栈
        head = new Node(null, null);
        n = 0;
    }
    //判断栈是否为空
    public boolean isEmpty() {
        return n == 0;
    }
    //获取栈中元素的个数
    public int size() {
        return n;
    }

    //出栈
    public String pop() {
        // 记录第一个元素
        Node oldFirst = head.next;
        if (oldFirst == null) {
            return null;
        }
        // 删除首个元素
        head.next = head.next.next;
        // 个数-1
        n--;
        return oldFirst.item;
    }
    //入栈
    public void push(String t) {
        // 记录旧的下一个节点
        Node oldNext = head.next;
        // 创建新的节点(把t这个元素的值和头节点的下一个节点值构造给新的节点)
        Node node = new Node(t, oldNext);
        // 个数+1
        n++;
        // 新的节点连接到head的下一个节点
        head.next = node;
    }
    private class Node {
        public String item;
        public Node next;

        public Node(String item, Node next) {
            this.item = item;
            this.next = next;
        }
    }
    // 判断str中左右括号是否匹配
    private static boolean matchBrackets(String str) {
        // 1. 创建一个栈来存储左括号
        ZHANG_WEI_LE_23_Q1 stack = new  ZHANG_WEI_LE_23_Q1();
        // 2. 从右往右遍历字符串，拿到每一个字符
        for (int i = 0; i < str.length(); i++) {
            // 拿到每一个字符串
            String currentChar = str.charAt(i) + "";
            // 3.判断该字符串是不是左括号，如果是，则放入栈中
            if (currentChar.equals("(")) {
                stack.push(currentChar);
                // 4. 判断该字符串是否是右括号，如果是，从栈中弹出一个元素t
            } else if (currentChar.equals(")")) {
                String t = stack.pop();
                // 判断t是否为null。如果为null说明没有左括号匹配，否则有左括号匹配
                if (t == null) {
                    return false;
                }
                // 如果不是,就继续下一个循环
            }
        }
        // 循环完毕之后，判断栈中是否还有剩余的左括号，如果有，说明不匹配，如果没有，则匹配
        if (stack.size() == 0) {
            return true;
        } else {
            return false;
        }
    }
    public static void main(String[] args) {
        ZHANG_WEI_LE_23_Q1 stack = new  ZHANG_WEI_LE_23_Q1();
        stack.push("a");
        stack.push("b");
        stack.push("c");
        stack.push("d");
        System.out.println(stack.size());
        System.out.println(stack.pop());//后进先出  所以会输出d
        System.out.println(stack.size());//3
        System.out.println(stack.isEmpty());//判断是否为空
        stack.pop();
        stack.pop();
        stack.pop();//全部出栈
        System.out.println(stack.isEmpty());
        System.out.println(stack.size());//0
    }
}
